﻿using System;
using System.Data;
using System.Data.SqlClient;
using System.Text.RegularExpressions;

namespace prjKQXS_DLL.Danh_muc
{
    public class clsDMDonVi
    {
        //DMDONVI (Danh mục đơn vị)
        //Lưu trữ thông tin các phòng ban trực thuộc công ty
        //=============================================================
        //1	ID	        int		            Identity: Yes, 1, 1;	No
        //2	Ma_DT	    char	    1	    Mã đơn vị	            No      Là 1 ký số từ 0 - 9.
        //3	Ten_DT	    nvarchar	500	    Tên đơn vị	            No
        //4	Giam_Doc	nvarchar	50	    Giám đốc đơn vị	        Yes
        //5	SDT	        nvarchar	50	    Số điện thoại	        Yes
        //6	FAX	        nvarchar	50	    Số FAX	                Yes
        //7	Dia_Chi	    nvarchar	MAX	    Địa chỉ đơn vị	        Yes
        //8	isPublic	bit		            Default value: 1	    No
        //=============================================================

        //Cài đặt event OnInvalid để bắt lỗi khi gán giá trị thuộc tính không hợp lệ
        public delegate void OnInvalidHandler(string msg);
        public event OnInvalidHandler OnInvalid;

        //Cài đặt event OnError để bắt các lỗi chưa được xử lý
        public delegate void OnErrorHandler(Exception e);
        public event OnErrorHandler OnError;

        //Cài đặt event OnAction để thông báo các trạng thái kết quả
        public delegate void OnActionHandler(int result);
        public event OnActionHandler OnAction;

        //#region Fields ===============================================================
        ////1	ID	        int		            Identity: Yes, 1, 1;	No
        //int fID;

        ////2	Ma_DT	    char	    1	    Mã đơn vị	            No      Là 1 ký số từ 0 - 9.
        //string fMaDV;

        ////3	Ten_DT	    nvarchar	500	    Tên đơn vị	            No
        //string fTenDV;

        ////4	Giam_Doc	nvarchar	50	    Giám đốc đơn vị	        Yes
        //string fGiamDoc;

        ////5	SDT	        nvarchar	50	    Số điện thoại	        Yes
        //string fSDT;

        ////6	FAX	        nvarchar	50	    Số FAX	                Yes
        //string fFax;

        ////7	Dia_Chi	    nvarchar	MAX	    Địa chỉ đơn vị	        Yes
        //string fDiaChi;

        ////8	isPublic	bit		            Default value: 1	    No
        //bool fIsPublic;
        //#endregion ===================================================================


        //#region Properties ===========================================================
        ////1	ID	        int		            Identity: Yes, 1, 1;	No
        //public int pID
        //{
        //    get
        //    {
        //        return fID;
        //    }
        //}

        ////2	Ma_DT	    char	    1	    Mã đơn vị	            No      Là 1 ký số từ 0 - 9.
        //public string pMaDV
        //{
        //    get
        //    {
        //        return fMaDV;
        //    }

        //    set
        //    {
        //        Regex rMaDV = new Regex(@"^\d{1}$");
        //        if (value.ToString().Trim().Length == 1) value = "0" + value;
        //        if (rMaDV.IsMatch(value)) fMaDV = value;
        //        else
        //        {
        //            OnInvalid("Ma_DT");
        //        }
        //    }
        //}

        ////3	Ten_DT	    nvarchar	500	    Tên đơn vị	            No
        //public string pTenDV
        //{
        //    get
        //    {
        //        return fTenDV;
        //    }

        //    set
        //    {
        //        fTenDV = value;
        //    }
        //}

        ////4	Giam_Doc	nvarchar	50	    Giám đốc đơn vị	        Yes
        //public string pGiamDoc
        //{
        //    get
        //    {
        //        return fGiamDoc;
        //    }

        //    set
        //    {
        //        fGiamDoc = value;
        //    }
        //}

        ////5	SDT	        nvarchar	50	    Số điện thoại	        Yes
        //public string pSDT
        //{
        //    get
        //    {
        //        return fSDT;
        //    }

        //    set
        //    {
        //        fSDT = value;
        //    }
        //}

        ////6	FAX	        nvarchar	50	    Số FAX	                Yes
        //public string pFax
        //{
        //    get
        //    {
        //        return fFax;
        //    }

        //    set
        //    {
        //        fFax = value;
        //    }
        //}

        ////7	Dia_Chi	    nvarchar	MAX	    Địa chỉ đơn vị	        Yes
        //public string pDiaChi
        //{
        //    get
        //    {
        //        return fDiaChi;
        //    }

        //    set
        //    {
        //        fDiaChi = value;
        //    }
        //}

        ////8	isPublic	bit		            Default value: 1	    No
        //public bool pIsPublic
        //{
        //    get
        //    {
        //        return fIsPublic;
        //    }

        //    set
        //    {
        //        fIsPublic = value;
        //    }
        //}
        //#endregion ===================================================================


        #region Methods ==============================================================
        //public clsDMDonVi(string connectionString)
        //{
        //    try
        //    {
        //        SqlConnection conn = new SqlConnection(connectionString);
        //        conn.Open();
        //        SqlCommand cmd = new SqlCommand("proc_getNewID", conn);
        //        cmd.CommandType = CommandType.StoredProcedure;
        //        cmd.Parameters.AddWithValue("@tableName", "DMDONVI");
        //        pMaDV = Convert.ToInt32(cmd.ExecuteScalar()).ToString();
        //    }
        //    catch (Exception e)
        //    {
        //        OnError(e);
        //    }
        //}

        public string generateMaDV()
        {
            string ma = "0";

            if (clsLicense.checkLicense())
            {
                try
                {
                    DataTable dt = clsCommon.FillData("SELECT Ma_DT FROM DMDONVI ORDER BY Ma_DT");
                    if (dt.Rows.Count > 0)
                    {
                        for (int i = 0; i < dt.Rows.Count; i++)
                        {
                            int j = Convert.ToInt32(dt.Rows[i]["Ma_DT"]);
                            if (i < j)
                            {
                                ma = i.ToString();
                                i = dt.Rows.Count;
                            }
                        }
                    }
                }
                catch (Exception e)
                {
                    OnError(e);
                }
            }

            return ma;
        }

        public DataTable getAllDonVi(bool isPublic)
        {
            DataTable dt = new DataTable();

            if (clsLicense.checkLicense())
            {
                try
                {
                    SqlConnection conn = new SqlConnection(BienTc.connString);

                    SqlDataAdapter da = new SqlDataAdapter("Select * from DMDONVI where isPublic = @isPublic", conn);
                    da.SelectCommand.Parameters.AddWithValue("@isPublic", isPublic);
                    da.Fill(dt);
                }
                catch (Exception e)
                {
                    OnError(e);
                }
            }

            return dt;
        }

        public void Add(DataRow dr)
        {
            if (clsLicense.checkLicense())
            {
                try
                {
                    string sql = "INSERT DMDONVI (Ma_DT, Ten_DT, Giam_Doc, SDT, FAX, Dia_Chi, isPublic) " +
                        "VALUES (@Ma_DT, @Ten_DT, @Giam_Doc, @SDT, @FAX, @Dia_Chi, 1)";
                    SqlConnection conn = new SqlConnection(BienTc.connString);
                    conn.Open();
                    SqlCommand cmd = new SqlCommand(sql, conn);
                    cmd.Parameters.AddWithValue("@Ma_DT", dr["Ma_DT"].ToString().Trim());
                    cmd.Parameters.AddWithValue("@Ten_DT", dr["Ten_DT"]);
                    cmd.Parameters.AddWithValue("@Giam_Doc", dr["Giam_Doc"]);
                    cmd.Parameters.AddWithValue("@SDT", dr["SDT"]);
                    cmd.Parameters.AddWithValue("@FAX", dr["FAX"]);
                    cmd.Parameters.AddWithValue("@Dia_Chi", dr["Dia_Chi"]);
                    int i = cmd.ExecuteNonQuery();
                }
                catch (Exception e)
                {
                    OnError(e);
                }
            }
        }

        public void Update(DataRow dr)
        {
            if (clsLicense.checkLicense())
            {
                try
                {
                    string sql = "UPDATE DMDONVI SET Ten_DT=@Ten_DT, Giam_Doc=@Giam_Doc, SDT=@SDT, FAX=@FAX, Dia_Chi=@Dia_Chi " +
                        "WHERE Ma_DT=@Ma_DT and isPublic=1";
                    SqlConnection conn = new SqlConnection(BienTc.connString);
                    conn.Open();
                    SqlCommand cmd = new SqlCommand(sql, conn);
                    cmd.Parameters.AddWithValue("@Ma_DT", dr["Ma_DT"].ToString().Trim());
                    cmd.Parameters.AddWithValue("@Ten_DT", dr["Ten_DT"]);
                    cmd.Parameters.AddWithValue("@Giam_Doc", dr["Giam_Doc"]);
                    cmd.Parameters.AddWithValue("@SDT", dr["SDT"]);
                    cmd.Parameters.AddWithValue("@FAX", dr["FAX"]);
                    cmd.Parameters.AddWithValue("@Dia_Chi", dr["Dia_Chi"]);
                    int i = cmd.ExecuteNonQuery();
                }
                catch (Exception e)
                {
                    OnError(e);
                }
            }
        }

        public void Delete(string madv, bool canRestore)
        {
            if (clsLicense.checkLicense())
            {
                try
                {
                    SqlConnection sqlconn = new SqlConnection(BienTc.connString);
                    sqlconn.Open();
                    SqlCommand cmd;

                    if (canRestore)
                    {
                        cmd = new SqlCommand("UPDATE DMDONVI SET isPublic = 0 Where Ma_DT = '" + madv + "' and isPublic=1", sqlconn);
                    }
                    else
                    {
                        cmd = new SqlCommand("DELETE DMDONVI WHERE Ma_DT = '" + madv + "' and isPublic = 0", sqlconn);
                    }

                    int i = cmd.ExecuteNonQuery();
                }
                catch (SqlException e)
                {
                    if (e.ErrorCode == -2146232060) //Ràng buộc khóa ngoại ở bảng khác
                        OnAction(e.ErrorCode);
                }
                catch (Exception e)
                {
                    OnError(e);
                }
            }
        }

        public void Restore(string madv)
        {
            if (clsLicense.checkLicense())
            {
                try
                {
                    SqlConnection sqlconn = new SqlConnection(BienTc.connString);
                    sqlconn.Open();
                    SqlCommand cmd;
                    cmd = new SqlCommand("UPDATE DMDONVI SET isPublic = 1 Where Ma_DT = '" + madv + "' and isPublic=0", sqlconn);
                    int i = cmd.ExecuteNonQuery();
                }
                catch (Exception e)
                {
                    OnError(e);
                }
            }
        }
        #endregion ===================================================================
    }
}
